using System;
using System.Collections.Generic;
using System.Text;
using Sinacor.Servico.Bovespa.ResumoFinanceiro.BusinessEntity;
using Sinacor.Infra.Service.Data;
using Sinacor.Infra.Service.Security.Authorization;
using System.Data.Common;
using Sinacor.Servico.Bovespa.Comum.ResourceAccess;
using System.Data;
using Sinacor.Servico.Bovespa.BovespaBase.Util;

namespace Sinacor.Servico.Bovespa.ResumoFinanceiro.ResourceAccess
{
    public class ResumoFinanceiro : Sinacor.Infra.Service.Data.BaseResourceAccess
    {
        public ResumoFinanceiro() : base(AuthorizationContext.Current.CompanyId) { }
        /// <summary>
        /// Metodo responsavel por realizar a consulta de resumo financeiro
        /// Data: 07/12/2007
        /// Autor: Diogo Milanez
        /// Obs: Criacao do metodo
        /// </summary>
        /// <param name="modulo"></param>
        /// <param name="request"></param>
        /// <returns></returns>
        public List<BusinessEntity.ResumoFinanceiro> Consultar(BusinessEntity.Enum.ModuloChamador modulo, BusinessEntity.ResumoFinanceiro request)
        {
            OracleDataBase dbResumoFinanceiro = base.DataBase; //new OracleDataBase(AuthorizationContext.Current.CompanyId);
            DbCommand dbCommand;
            List<BusinessEntity.ResumoFinanceiro> retorno = new List<BusinessEntity.ResumoFinanceiro>();
            BusinessEntity.ResumoFinanceiro resumoFinanceiroBE = null;
            StringBuilder sql = new StringBuilder();

            sql.Append("SELECT ");
            sql.Append("A.VL_VDAVIS, ");			//1		- 00
            sql.Append("A.VL_CPAVIS,");				//2		- 01
            sql.Append("A.VL_VDAOPC, ");			//5		- 02
            sql.Append("A.VL_CPAOPC, ");			//6		- 03
            sql.Append("A.VL_TERMO, ");				//7		- 04
            sql.Append("A.VL_VALCOR, ");			//8		- 05
            sql.Append("NVL(A.VL_TAXREG,0), ");		//9		- 06
            sql.Append("NVL(A.VL_EMOLUM,0), ");		//10	- 07
            sql.Append("A.VL_TAXANA, ");			//11	- 08
            sql.Append("A.VL_VALDES, ");			//12	- 09
            sql.Append("A.VL_LIQNOT, ");			//13	- 10
            sql.Append("A.VL_REPCOR, ");			//14	- 11
            sql.Append("A.VL_IRCORR+NVL(A.VL_IRRF_DESPESA,0), ");	//15	- 12
            sql.Append("A.VL_DESCON, ");			//16	- 13
            sql.Append("A.VL_CORTOT, ");			//17	- 14
            sql.Append("A.VL_TOTNEG, ");			//18	- 15
            sql.Append("A.VL_COMASS, ");			//19	- 16
            sql.Append("A.VL_TAXREG_DT, ");			//20	- 17
            sql.Append("A.VL_TAXREG_CP, ");			//21	- 18
            sql.Append("A.VL_TAXREG_OF, ");			//22	- 19
            sql.Append("A.VL_EMOLUM_DT, ");			//23	- 20	
            sql.Append("A.VL_EMOLUM_CP, ");			//24	- 21
            sql.Append("A.VL_EMOLUM_OF, ");			//25	- 22
            sql.Append("A.VL_TAXPTA, ");			//26	- 23	
            sql.Append("A.VL_TAXIOF, ");			//27	- 24
            sql.Append("A.CD_GRUP_CONT, ");			//28	- 25	
            sql.Append("D.PZ_PROJ_CC, ");			//29	- 26
            sql.Append("C.PC_CORCOR_PRIN, ");		//30	- 27			

            sql.Append("TRUNC(((DECODE(A.VL_VALCOR,0,1,A.VL_VALCOR) / ");	  //31	- 28
            sql.Append("DECODE(A.VL_CORTOT,0,1,A.VL_CORTOT))-1) * 100,24), ");//31	- 28

            sql.Append("A.CD_BOLFAT, ");			//32	- 29
            sql.Append("A.CD_CLIENTE, ");			//33	- 30
            sql.Append("A.DT_NEGOCIO, ");			//34	- 31
            sql.Append("A.IN_BROKER, ");			//35	- 32
            sql.Append("A.VL_DEBENT, ");			//36	- 33
            sql.Append("A.IN_CORRESP, ");			//37	- 34
            sql.Append("A.VL_FUTURO, ");			//38	- 35
            sql.Append("A.VL_TAXREG_BV, ");			//39	- 36
            sql.Append("A.VL_TAXREG_CB, ");			//40	- 37
            sql.Append("A.VL_EMOLUM_BV, ");			//41	- 38
            sql.Append("A.VL_EMOLUM_CB, ");			//42	- 39
            sql.Append("NVL(A.VL_IRRETIDO,0 ), ");	//43	- 40
            sql.Append("A.TP_NEGOCIO, ");			//44	- 41
            sql.Append("A.VL_VDAFUT, ");			//46	- 42	
            sql.Append("A.VL_CPAFUT, ");			//47	- 43
            sql.Append("A.VL_TITPUB, ");			//48	- 44
            sql.Append("A.IN_ISS, ");				//49	- 45
            sql.Append("A.VL_ISS, ");				//50	- 46
            sql.Append("A.VL_CORTOT_ORI, ");		//51	- 47
            sql.Append("A.VL_VALCOR_ORI, ");		//52	- 48
            sql.Append("C.NM_APELIDO, ");			//53	- 49
            sql.Append("C.IN_CONTA_INV, ");			//54	- 50
            sql.Append("A.IN_NOTA_UNICA, ");		//55	- 51
            sql.Append("A.VL_CORRESP, ");			//56	- 52
            sql.Append("G.NM_CLIENTE || ' ' || F.NM_COMPL_NOME "); //57 - 53 - nome do cliente

            if (modulo == BusinessEntity.Enum.ModuloChamador.ControleOrdens)
            {
                sql.Append("FROM TBOFINCLI A, TBOCALBOL B, V_TSCCLIBOL_AUX C, TBOPROJCC D, TSCCLIBOL F, TSCCLIGER G ");
            }
            else if (modulo == BusinessEntity.Enum.ModuloChamador.FaturamentoBolsas)
            {
                sql.Append("FROM TBOFINCLI A, TBOCALE B, V_TSCCLIBOL_AUX C, TBOPROJCC D,  TSCCLIBOL F, TSCCLIGER G ");
            }

            sql.Append("WHERE ");
            sql.Append("D.DT_NEGOCIO = A.DT_NEGOCIO ");
            sql.Append("AND D.CD_BOLFAT = A.CD_BOLFAT ");
            sql.Append("AND D.TP_NEGOCIO = A.TP_NEGOCIO ");
            sql.Append("AND A.DT_NEGOCIO = :dataPregao ");
            sql.Append("AND A.CD_CLIENTE = C.CD_CLIENTE_ORI ");
            sql.Append("AND B.DT_MOV     = A.DT_NEGOCIO ");
            sql.Append("AND B.CD_PRACA   = A.CD_BOLFAT ");

            Acesso acesso = new Acesso();
            sql.Append("AND " + acesso.ConsultarListaAssessores("C.CD_ASSESSOR", 0, 9999999) + " ");
            sql.Append("AND F.CD_CLIENTE = A.CD_CLIENTE ");
            sql.Append("AND F.CD_CPFCGC = G.CD_CPFCGC ");
            sql.Append("AND F.DT_NASC_FUND = G.DT_NASC_FUND ");
            sql.Append("AND F.CD_CON_DEP = G.CD_CON_DEP ");

            if (request.IsSomenteContaSelecionada)
            {
                sql.Append("AND C.CD_CLIENTE_ORI = :codigoCliente ");
            }
            else
            {
                sql.Append("AND (C.CD_CLIENTE_NOR = :codigoCliente OR C.CD_CLIENTE_CI  = :codigoCliente ) ");
            }

            switch (request.TipoCliente)
            {
                case BusinessEntity.Enum.TipoCliente.Cliente:
                    sql.Append("AND A.IN_BROKER = 'C' ");
                    break;
                case BusinessEntity.Enum.TipoCliente.Broker:
                    sql.Append("AND A.IN_BROKER = 'B' ");
                    break;
                case BusinessEntity.Enum.TipoCliente.Financeiro:
                    sql.Append("AND A.IN_BROKER = 'F' ");
                    break;
            }

            ///gerar dbCommand
            dbCommand = dbResumoFinanceiro.GetSqlStringCommand(sql.ToString());

            ///atribuir parametros
            dbResumoFinanceiro.AddInParameter(dbCommand, "dataPregao", DbType.Date, request.DataPregao);
            dbResumoFinanceiro.AddInParameter(dbCommand, "codigoCliente", DbType.Int32, request.CodigoCliente);

            ///executar query
            ///
            IDataReader reader = dbResumoFinanceiro.ExecuteReader(dbCommand);

            while (reader.Read())
            {
                resumoFinanceiroBE = new BusinessEntity.ResumoFinanceiro();

                resumoFinanceiroBE.IsSomenteContaSelecionada = request.IsSomenteContaSelecionada;//20080324 - dmilanez - passar a retornar o valore informado para a propriedade IsSomenteContaSelecionada
                resumoFinanceiroBE.DataPregao = request.DataPregao;

                resumoFinanceiroBE.VolumeVendasVista = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(0), true);
                resumoFinanceiroBE.VolumeComprasVista = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(1), true);
                resumoFinanceiroBE.VolumeVendasOpcao = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(2), true);
                resumoFinanceiroBE.VolumeComprasOpcao = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(3), true);
                resumoFinanceiroBE.VolumeOperacoesTermo = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(4), true);
                resumoFinanceiroBE.ValorCorretagemOriginal = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(5), true);
                resumoFinanceiroBE.ValorTotalTaxaRegistro = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(6), true);
                resumoFinanceiroBE.ValorTotalEmolumentos = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(7), true);
                resumoFinanceiroBE.ValorTaxaANA = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(8), true);
                resumoFinanceiroBE.ValorDescontoCorretagem = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(9), true);
                resumoFinanceiroBE.ValorLiquidoNotaCorretagem = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(10), true);
                resumoFinanceiroBE.ValorRepasseCorretagemCorrespondente = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(11), true);
                resumoFinanceiroBE.ValorIRCorretagem = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(12), true);
                resumoFinanceiroBE.ValorDescontoCorretagemCliente = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(13), true);
                resumoFinanceiroBE.ValorTotalCorretagem = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(14), true);
                resumoFinanceiroBE.VolumeNegocios = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(15), true);
                resumoFinanceiroBE.ValorComissaoAssessorCliente = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(16), true);
                resumoFinanceiroBE.ValorTaxaRegistroOperacoesDayTrade = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(17), true);
                resumoFinanceiroBE.ValorTaxaRegistroOperacoesCarteiraPropria = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(18), true);
                resumoFinanceiroBE.ValorTaxaRegistroOperacoesFinais = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(19), true);
                resumoFinanceiroBE.ValorEmolumentosOperacoesDayTrade = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(20), true);
                resumoFinanceiroBE.ValorEmolumentosOperacoesCarteiraPropria = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(21), true);
                resumoFinanceiroBE.ValorEmolumentosOperacoesFinais = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(22), true);
                resumoFinanceiroBE.ValorTaxaPTAN = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(23), true);
                resumoFinanceiroBE.ValorTaxaIOF = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(24), true);
                resumoFinanceiroBE.CodigoGrupoContabilCliente = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(reader.GetValue(25));
                resumoFinanceiroBE.PrazoLiquidacao = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDateTime(reader.GetValue(26), true);
                resumoFinanceiroBE.PorcentagemDescontoCadastrado = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(27), true);
                resumoFinanceiroBE.PorcentagemDescontoAplicado = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(28), true);
                resumoFinanceiroBE.CodigoBolsaFaturamento = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(reader.GetValue(29));
                resumoFinanceiroBE.CodigoCliente = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorInt32(reader.GetValue(30));
                //retorno.DataNegocio = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDateTime(reader.GetValue(31)).Value;
                resumoFinanceiroBE.DataMovimento = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDateTime(reader.GetValue(31));


                switch (Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(reader.GetValue(32)))
                {
                    case "B":
                        resumoFinanceiroBE.TipoCliente = BusinessEntity.Enum.TipoCliente.Broker;
                        break;
                    case "C":
                        resumoFinanceiroBE.TipoCliente = BusinessEntity.Enum.TipoCliente.Cliente;
                        break;
                    case "F":
                        resumoFinanceiroBE.TipoCliente = BusinessEntity.Enum.TipoCliente.Financeiro;
                        break;
                }

                resumoFinanceiroBE.ValorOperacoesDebentures = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(33), true);
                resumoFinanceiroBE.IsCorrespondente = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(reader.GetValue(34)) == "S";
                resumoFinanceiroBE.ValorOperacoesFuturo = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(35), true);
                resumoFinanceiroBE.ValorTaxaRegistroBovespa = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(36), true);
                resumoFinanceiroBE.ValorTaxaRegistroCBLC = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(37), true);
                resumoFinanceiroBE.ValorEmolumentosLiquidacaoBovespa = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(38), true);
                resumoFinanceiroBE.ValorEmolumentosLiquidacaoCBLC = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(39), true);
                resumoFinanceiroBE.ValorIRRF = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(40), true);
                resumoFinanceiroBE.TipoNegocio = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(reader.GetValue(41));
                resumoFinanceiroBE.ValorTotalVendaMercadoFuturo = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(42), true);
                resumoFinanceiroBE.ValorTotalCompraMercadoFuturo = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(43), true);
                resumoFinanceiroBE.ValorOperacoesTitulosPublicos = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(44), true);
                resumoFinanceiroBE.IndicadorISS = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(reader.GetValue(45));
                resumoFinanceiroBE.ValorISS = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(46), true);
                resumoFinanceiroBE.ValorCorretagemTotalOriginal = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(47), true);
                
                resumoFinanceiroBE.ApelidoCliente = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(reader.GetValue(49));
                resumoFinanceiroBE.IsContaInvestimento = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(reader.GetValue(50)) == "S";
                resumoFinanceiroBE.IsNotaUnica = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(reader.GetValue(51)) == "S";
                resumoFinanceiroBE.ValorRepasseCorrespondente = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(reader.GetValue(52), true);
                resumoFinanceiroBE.NomeCliente = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(reader.GetValue(53));

                ///se for mercado futuro, recuperar tambem as informacoes de ajustes futuros
                if (resumoFinanceiroBE.TipoNegocio == "FUT")
                {
                    sql = new StringBuilder();
                    switch (resumoFinanceiroBE.TipoCliente)
                    {
                        case BusinessEntity.Enum.TipoCliente.Cliente:
                            sql.Append("SELECT NVL(SUM(VL_AJU_ATU),0) ");
                            sql.Append("FROM TORFUTDIA ");
                            sql.Append("WHERE DT_FINANC  = :dataPregao ");
                            sql.Append("AND CD_CLIENTE = :codigoCliente ");
                            sql.Append("AND TP_NEGOCIO = 'AJU'");
                            break;
                        case BusinessEntity.Enum.TipoCliente.Broker:
                            sql.Append("SELECT NVL(SUM(A.VL_AJU_ATU),0) ");
                            sql.Append("FROM TORFUTDIA A ");
                            sql.Append("WHERE A.DT_FINANC  = :dataPregao ");
                            sql.Append("AND A.TP_NEGOCIO = 'AJU' ");
                            sql.Append("AND EXISTS ");
                            sql.Append("( SELECT 0 ");
                            sql.Append("FROM TSCCLIBOL B ");
                            sql.Append("WHERE B.CD_CLIENTE_LIQFIN = :codigoCliente ");
                            sql.Append("AND B.CD_CLIENTE = A.CD_CLIENTE )");
                            break;
                        case BusinessEntity.Enum.TipoCliente.Financeiro:
                            sql.Append("SELECT NVL(SUM(A.VL_AJU_ATU),0) ");
                            sql.Append("FROM TORFUTDIA A ");
                            sql.Append("WHERE A.DT_FINANC  = :dataPregao ");
                            sql.Append("AND A.TP_NEGOCIO = 'AJU' ");
                            sql.Append("AND EXISTS ");
                            sql.Append("( SELECT 0 ");
                            sql.Append("FROM TSCCLIBOL B ");
                            sql.Append("WHERE B.CD_CLIENTE_CC = :codigoCliente ");
                            sql.Append("AND B.CD_CLIENTE = A.CD_CLIENTE) ");
                            break;
                    }

                    dbCommand = dbResumoFinanceiro.GetSqlStringCommand(sql.ToString());
                    dbResumoFinanceiro.AddInParameter(dbCommand, "dataPregao", DbType.Date, request.DataPregao);
                    dbResumoFinanceiro.AddInParameter(dbCommand, "codigoCliente", DbType.Int32, request.CodigoCliente);

                    resumoFinanceiroBE.ValorAjustePosicao = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dbResumoFinanceiro.ExecuteScalar(dbCommand), true);
                    resumoFinanceiroBE.ValorAjusteDia = resumoFinanceiroBE.ValorTotalVendaMercadoFuturo - resumoFinanceiroBE.ValorAjustePosicao;
                    resumoFinanceiroBE.ValorAjusteDayTrade = resumoFinanceiroBE.VolumeVendasVista - resumoFinanceiroBE.VolumeComprasVista;
                }

                retorno.Add(resumoFinanceiroBE);
            }

            reader.Close();

            return retorno;
        }

        /// <summary>
        /// Metodo responsavel por alterar total liquido
        /// </summary>
        /// <param name="request"></param>
        public BusinessEntity.RetornoAlteracaoNota
            AlterarTotalLiquido(BusinessEntity.ResumoFinanceiro request)
        {
            BusinessEntity.RetornoAlteracaoNota response = new BusinessEntity.RetornoAlteracaoNota();
            OracleDataBase dbResumoFinanceiro = base.DataBase;//new OracleDataBase(AuthorizationContext.Current.CompanyId);
            DbCommand dbCommand;
            StringBuilder sql = new StringBuilder();
            string dataFormatada;

            //comentario incluido por eduardo sertorio em 20071220 para comparar tipos do Oracle com DBType
            //PROCEDURE POR_ALTNOTA
            // Argument Name                  Type                    In/Out Default?
            // ------------------------------ ----------------------- ------ --------
            // P_SDATANEGO                    VARCHAR2                IN
            // P_NCODCLI                      NUMBER                  IN
            // P_SBOLFAT                      VARCHAR2                IN
            // P_STIPONOTA                    VARCHAR2                IN
            // P_NCODUSUA                     NUMBER                  IN
            // R_SMSGERRO                     VARCHAR2                OUT
            // P_NVALOR                       NUMBER                  IN
            // P_STIPOVAL                     VARCHAR2                IN
            // R_SALTEROU                     VARCHAR2                OUT
            // P_NCTRL                        NUMBER                  IN
            // P_NCTRLPCT                     NUMBER                  IN
            // P_NCTRLVAL                     NUMBER                  IN

            sql.Append("POR_ALTERFIN.POR_ALTNOTA");

            dbCommand = dbResumoFinanceiro.GetStoredProcCommand(sql.ToString());
            dataFormatada = Funcoes.FormatarData(request.DataMovimento, "/");
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_SDATANEGO", DbType.AnsiString, dataFormatada);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_NCODCLI", DbType.Int32, request.CodigoCliente);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_SBOLFAT", DbType.AnsiString, request.CodigoBolsaFaturamento);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_STIPONOTA", DbType.AnsiString, request.TipoNegocio);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_NCODUSUA", DbType.Int32, request.CodigoUsuario);
            ///rever forma de recuperar usuario conectado ao sistema
            dbResumoFinanceiro.AddOutParameter(dbCommand, "R_SMSGERRO", DbType.AnsiString, 4000);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_NVALOR", DbType.Decimal, request.ValorLiquidoNotaCorretagem);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_STIPOVAL", DbType.AnsiString, "L");
            dbResumoFinanceiro.AddOutParameter(dbCommand, "R_SALTEROU", DbType.AnsiString, 4);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_NCTRL", DbType.Int32, 0);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_NCTRLPCT", DbType.Int32, 0);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_NCTRLVAL", DbType.Int32, 0);

            dbResumoFinanceiro.ExecuteNonQuery(dbCommand);

            response.AlterouNota = Convert.ToString(dbResumoFinanceiro.GetParameterValue(dbCommand, "R_SALTEROU")) == "S";
            response.MensagemRetornada.Codigo = 0;//TODO
            response.MensagemRetornada.Descricao = Convert.ToString(dbResumoFinanceiro.GetParameterValue(dbCommand, "R_SMSGERRO"));

            return response;
        }

        /// <summary>
        /// Metodo responsavel por realizar a alteracao do valor da corretagem
        /// Data: 07/12/2007
        /// Autor: Diogo Milanez
        /// Obs: Criacao do metodo
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public BusinessEntity.RetornoAlteracaoNota
            AlterarValorCorretagem(BusinessEntity.ResumoFinanceiro request)
        {
            BusinessEntity.RetornoAlteracaoNota response = new BusinessEntity.RetornoAlteracaoNota();
            OracleDataBase dbResumoFinanceiro = base.DataBase;//new OracleDataBase(AuthorizationContext.Current.CompanyId);
            DbCommand dbCommand;
            StringBuilder sql = new StringBuilder();
            string dataFormatada;
            sql.Append("POR_ALTERFIN.POR_ALTNOTA");

            dbCommand = dbResumoFinanceiro.GetStoredProcCommand(sql.ToString());
            dataFormatada = Funcoes.FormatarData(request.DataMovimento, "/");
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_SDATANEGO", DbType.AnsiString, dataFormatada);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_NCODCLI", DbType.Int32, request.CodigoCliente);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_SBOLFAT", DbType.AnsiString, request.CodigoBolsaFaturamento);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_STIPONOTA", DbType.AnsiString, request.TipoNegocio);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_NCODUSUA", DbType.Int32, request.CodigoUsuario);
            ///rever forma de recuperar usuario conectado ao sistema
            dbResumoFinanceiro.AddOutParameter(dbCommand, "R_SMSGERRO", DbType.AnsiString, 4000);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_NVALOR", DbType.Decimal, request.ValorCorretagemOriginal);

            if (request.IsCorretagemISSReverso)
                dbResumoFinanceiro.AddInParameter(dbCommand, "P_STIPOVAL", DbType.AnsiString, "R");
            else
                dbResumoFinanceiro.AddInParameter(dbCommand, "P_STIPOVAL", DbType.AnsiString, "C");

            dbResumoFinanceiro.AddOutParameter(dbCommand, "R_SALTEROU", DbType.AnsiString, 4);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_NCTRL", DbType.Int32, 0);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_NCTRLPCT", DbType.Int32, 0);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_NCTRLVAL", DbType.Int32, 0);

            dbResumoFinanceiro.ExecuteNonQuery(dbCommand);

            response.AlterouNota = Convert.ToString(dbResumoFinanceiro.GetParameterValue(dbCommand, "R_SALTEROU")) == "S";
            response.MensagemRetornada.Codigo = 0;//TODO
            response.MensagemRetornada.Descricao = Convert.ToString(dbResumoFinanceiro.GetParameterValue(dbCommand, "R_SMSGERRO"));

            return response;
        }

        /// <summary>
        /// Metodo responsavel por alterar o percentural de corretagem]
        /// Data: 07/12/2007
        /// Autor: Diogo Milanez
        /// Obs: Criacao do Metodo
        /// 
        /// Data: 19/12/2007
        /// Autor: Diogo Milanez
        /// Obs: Retorno foi alterado de void para BusinessEntity.RetornoAlteracaoNota
        /// </summary>
        /// <param name="request"></param>
        public BusinessEntity.RetornoAlteracaoNota
            AlterarPercentualCorretagem(BusinessEntity.ResumoFinanceiro request, DateTime dataMovimentoAtual, bool existeSistemaOrdem)
        {
            BusinessEntity.RetornoAlteracaoNota response = new BusinessEntity.RetornoAlteracaoNota();
            OracleDataBase dbResumoFinanceiro = base.DataBase;new OracleDataBase(AuthorizationContext.Current.CompanyId);
            DbCommand dbCommand;
            StringBuilder sql = new StringBuilder();
            string dataFormatada;
            sql.Append("POR_ALTERFIN.POR_ALTNOTA");

            dbCommand = dbResumoFinanceiro.GetStoredProcCommand(sql.ToString());
            dataFormatada = Funcoes.FormatarData(request.DataMovimento, "/");
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_SDATANEGO", DbType.AnsiString, dataFormatada);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_NCODCLI", DbType.Int32, request.CodigoCliente);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_SBOLFAT", DbType.AnsiString, request.CodigoBolsaFaturamento);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_STIPONOTA", DbType.AnsiString, request.TipoNegocio);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_NCODUSUA", DbType.Int32, request.CodigoUsuario);
            ///rever forma de recuperar usuario conectado ao sistema
            dbResumoFinanceiro.AddOutParameter(dbCommand, "R_SMSGERRO", DbType.AnsiString, 4000);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_NVALOR", DbType.Decimal, request.PorcentagemDescontoAplicado);

            if (request.IsCorretagemISSReverso)
                dbResumoFinanceiro.AddInParameter(dbCommand, "P_STIPOVAL", DbType.AnsiString, "D");
            else
                dbResumoFinanceiro.AddInParameter(dbCommand, "P_STIPOVAL", DbType.AnsiString, "P");

            dbResumoFinanceiro.AddOutParameter(dbCommand, "R_SALTEROU", DbType.AnsiString, 4);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_NCTRL", DbType.Int32, 0);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_NCTRLPCT", DbType.Int32, 0);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_NCTRLVAL", DbType.Int32, 0);

            dbResumoFinanceiro.ExecuteNonQuery(dbCommand);

            response.AlterouNota = Convert.ToString(dbResumoFinanceiro.GetParameterValue(dbCommand, "R_SALTEROU")) == "S";
            response.MensagemRetornada.Codigo = 0;//TODO
            response.MensagemRetornada.Descricao = Convert.ToString(dbResumoFinanceiro.GetParameterValue(dbCommand, "R_SMSGERRO"));

            return response;
        }


        /// <summary>
        /// metodo responsavel por realizad o calculo do resumo financeiro 
        /// Data: 06/12/2007
        /// Autor: Diogo Milanez
        /// Obs: Criacao do metodo
        /// </summary>
        /// <param name="request"></param>
        public void Calcular(BusinessEntity.ResumoFinanceiro request, string origem)
        {
            OracleDataBase dbResumoFinanceiro = base.DataBase;//new OracleDataBase(AuthorizationContext.Current.CompanyId);
            DbCommand dbCommand;
            StringBuilder sql = new StringBuilder();
            string dataFormatada;

            if (request.IsCorrespondente)
            {
                sql.Append("PR_CALFIN.FINANCEIRO_COR");
            }
            else
            {
                sql.Append("PR_CALFIN.FINANCEIRO_CLI");
            }

            dataFormatada = Funcoes.FormatarData(request.DataMovimento, "-");

            dbCommand = dbResumoFinanceiro.GetStoredProcCommand(sql.ToString());

            dbResumoFinanceiro.AddInParameter(dbCommand, "P_CODCLI", DbType.Int32, request.CodigoCliente);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_DATPRE", DbType.AnsiString, dataFormatada);
            dbResumoFinanceiro.AddInParameter(dbCommand, "P_SINORIGER", DbType.AnsiString, origem);// );

            dbResumoFinanceiro.ExecuteNonQuery(dbCommand);
        }

        public void Calcular(BusinessEntity.ResumoFinanceiro request)
        {
            Calcular(request, "Sinacor.Servico.Bovespa.ResumoFinanceiro");
        }
    }
}

